#include "../common/icsearch.hpp"
#include <gflags/gflags.h>

DEFINE_bool(run_mode, false, "程序的运行模式, false-调试; true-发布;");
DEFINE_string(log_file, "", "发布模式下, 用于指定日志的输出文件");
DEFINE_int32(log_level, 0, "发布模式下, 用于指定日志输出等级");

int main(int argc, char* argv[])
{
    google::ParseCommandLineFlags(&argc, &argv, true);
    wufan_im::init_logger(FLAGS_run_mode, FLAGS_log_file, FLAGS_log_level);
    std::shared_ptr<elasticlient::Client> client(new elasticlient::Client({"http://127.0.0.1:9200/"}));
    bool ret = wufan_im::ESIndex(client, "test_user")
        // 创建索引, 就相当于在设置表结构 - ai说的
        // 添加字段, 就相当于设置表的字段属性
        .append("nickname")
        .append("phone", "keyword", "standard", true) //手机号是不能进行分词的, 是一个关键字, 分词器用标准分词器, 需要构造索引
        .create();
    if (ret == false) {
        LOG_INFO("索引创建失败!");
        return -1;
    }
    LOG_INFO("索引创建成功");

    // 新增数据
    ret = wufan_im::ESInsert(client, "test_user")
        .append("nickname", "张三")
        .append("phone", "155666777")
        .insert("00001");   // 这个ID就相当于是每一次插入时数据的唯一标识
    if (ret == false) {
        LOG_ERROR("数据插入失败!");
        return -1;
    }
    // 数据的修改
    ret = wufan_im::ESInsert(client, "test_user")
        .append("nickname", "张三")
        .append("phone", "1334444555")
        .insert("00001");
    if (ret == false) {
        LOG_ERROR("数据更新失败!");
        return -1;
    }
    LOG_INFO("数据新增成功");

    Json::Value user = wufan_im::ESSearch(client, "test_user")
        .append_should_match("phone.keyword", "1334444555")     //检索的时候, 告诉ES, 这个关键词不要进行分词
        // .append_must_not_terms("nickname.keyword", {"张三"})
        .search();
    if (user.empty() || user.isArray() == false) {
        LOG_ERROR("结果为空, 或者结果不是数组类型");
        return -1;
    }
    LOG_INFO("数据检索成功");
    int sz = user.size();
    LOG_DEBUG("检索结果条目数量: {}", sz);
    for (int i = 0; i < sz; ++i) {
        LOG_INFO("nickname: {}", user[i]["_source"]["nickname"].asString());
    }

    ret = wufan_im::ESRemove(client, "test_user", "_doc").remove("00001");
    if (ret == false) {
        LOG_ERROR("删除数据失败");
        return -1;
    }
    LOG_INFO("数据删除成功");

    return 0;
}